/**
 * @author Jorge Mejuto Created on 09-feb-2005
 */
package net.eyra.negocio.explotacion.mantenimiento;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

import net.eyra.negocio.dao.ExplotacionDao;
import net.eyra.negocio.entidades.explotacion.Lectura;
import net.eyra.negocio.entidades.explotacion.Tarificador;
import net.eyra.utiles.HojaXLS;
import net.eyra.utiles.Periodo;

public class CargaExcelConCurvasCarga {

    public static void main(String[] args) throws Exception {
        CargaExcelConCurvasCarga c = new CargaExcelConCurvasCarga();
        Periodo periodo = new Periodo();
        c.CargarHojaExcel(37, "/home/jorge/Escritorio/NOGUERA.xls", false, 2, periodo);
    }

    private HojaXLS excel = null;

    public ArrayList<Lectura> CargarHojaXLS(int id_tarificador, String fichero, boolean cuartohoraria, int fila_inicial) throws Exception {
        int[] columnas = { 0, 1, 2, 3, 4, 5, 6, 7 };
        int[] tipos = { 0, 2, 1, 1, 1, 1, 1, 1 };
        ArrayList<Object> valores = null;
        CargarHoja(fichero);
        SimpleDateFormat sdf = new SimpleDateFormat();
        ArrayList<Lectura> lecturas = null;
        for (int num_hoja = 0; num_hoja < excel.getNumeroHojas(); num_hoja++) {
            valores = getValoresColumna(columnas, tipos, fila_inicial, num_hoja);
            lecturas = new ArrayList<Lectura>(valores.size());
            Date inicio = null;
            Date fin = null;
            for (int x = 0; x < valores.size(); x += 8) {
                Lectura lectura = new Lectura();
                if (valores.get(x + 1) == null) break;
                sdf.applyPattern("dd/MM/yyyy H:mm");
                Date fecha = null;
                try {
                    fecha = sdf.parse(valores.get(x) + " " + valores.get(x + 1));
                } catch (ParseException e) {
                    System.out.println("Error de parseo en la fecha: " + valores.get(x) + " : " + valores.get(x + 1));
                    System.exit(0);
                }
                if (inicio == null || inicio.after(fecha)) inicio = fecha;
                if (fin == null || fin.before(fecha)) fin = fecha;
                lectura.setTarificador(new Tarificador(id_tarificador));
                sdf.applyPattern("yyyy-MM-dd HH:mm:ss");
                lectura.setFecha(new Timestamp(sdf.parse(sdf.format(fecha)).getTime()));
                lectura.setActiva_importada(new Double(valores.get(x + 2).toString()).doubleValue());
                lectura.setActiva_exportada(new Double(valores.get(x + 3).toString()).doubleValue());
                lectura.setReactiva_q1(new Double(valores.get(x + 4).toString()).doubleValue());
                lectura.setReactiva_q2(new Double(valores.get(x + 5).toString()).doubleValue());
                lectura.setReactiva_q3(new Double(valores.get(x + 6).toString()).doubleValue());
                lectura.setReactiva_q4(new Double(valores.get(x + 7).toString()).doubleValue());

                // Calculamos el periodo y la hora

                Periodo _periodo = new Periodo(fecha, fecha);
                // Calendar cal = Calendar.getInstance();
                // sdf.applyPattern("yyyy-MM-dd");
                // Date periodo = new java.sql.Date(sdf.parse(sdf.format(fecha)).getTime());

                // cal.setTime(periodo);
                int hora = _periodo.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.HORA);

                int dia = _periodo.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.DIA);
                if (!cuartohoraria) {
                    if (hora == 0) {
                        hora = 24;
                        _periodo.setDatoFecha(Periodo.FECHA_INICIAL, Periodo.DIA, dia - 1);
                    }
                } else {
                    hora++;
                    if (_periodo.getDatoFecha(Periodo.FECHA_INICIAL, Periodo.MINUTO) == 0) {
                        hora--;
                        if (hora == 0) {
                            _periodo.setDatoFecha(Periodo.FECHA_INICIAL, Periodo.DIA, dia - 1);
                            hora = 24;
                        }
                    }
                }

                lectura.setPeriodo(_periodo.getFecha_inicial());
                lectura.setHora(hora);
                // valor indica si es verano o invierno ; 1 o 0. El verano es
                // desde el cambio de hora en marzo hasta el cambio de hora en
                // octubre (hay que comprobar el dia)
                int verano = 0;
                Calendar cal = Calendar.getInstance();
                cal.set(2011, 3, 27, 2, 0);
                Date i_verano = cal.getTime();
                cal.set(2011, 10, 30, 3, 0);
                Date f_verano = cal.getTime();
                if (lectura.getFecha().after(i_verano) && lectura.getFecha().before(f_verano)) verano = 1;
                lectura.setVerano(verano);
                lecturas.add(lectura);
            }
        }
        return lecturas;
    }

    private void CargarHoja(String ficheroExcel) throws Exception {
        if (excel == null) excel = new HojaXLS(ficheroExcel);
        else excel.setFicheroExcel(ficheroExcel);
        excel.CargarFicheroXLS();
    }

    public void CargarHojaExcel(int id_tarificador, String rutaFicheroExcel, boolean horaria, int numero_fila, Periodo periodo) throws Exception {
        ExplotacionDao dao = new ExplotacionDao();
        ArrayList<Lectura> lecturas;
        lecturas = CargarHojaXLS(id_tarificador, rutaFicheroExcel, horaria, numero_fila);
        dao.BorrarLecturas(id_tarificador, periodo, horaria);
        dao.setLecturas(lecturas, horaria);
    }

    private int CargarNumeroHoja(int num_hoja) {
        excel.CargarHoja(num_hoja);
        return excel.getNumeroFilas();
    }

    private ArrayList<Object> getValoresColumna(int[] num_columna, int[] tipo_columna, int num_fila_inicio, int num_hoja) {
        ArrayList<Object> lecturas = new ArrayList<Object>();
        int numero_filas = CargarNumeroHoja(num_hoja);
        int x;
        try {
            for (x = num_fila_inicio - 1; x < numero_filas; x++) {
                excel.CargarLinea(x);
                for (int y = 0; y < num_columna.length; y++) {
                    int tipo = tipo_columna[y]; // excel.getTipoCelda(y);
                    if (tipo == 0) lecturas.add(excel.getValorFechaCelda(num_columna[y]));
                    if (tipo == 1) lecturas.add(excel.getValorNumeroCelda(num_columna[y]));
                    if (tipo == 2) lecturas.add(excel.getValorHoraCelda(num_columna[y]));
                    if (tipo == 3) lecturas.add(excel.getValorTextoCelda(num_columna[y]));
                }
            }
        } catch (Exception e) {
            System.out.println(e.getLocalizedMessage());
            e.printStackTrace();
        }
        return lecturas;
    }
}